package puntajes;

import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.JOptionPane;

/**
 * Set de puntajes
 *
 * @author Cura Maru y Goldberg Daniel.
 * @see Puntaje2
 */
public class Puntajes {
	Set<Puntaje> listadoPuntajes = new TreeSet<Puntaje>(new Comparator<Puntaje>(){
		public int compare(Puntaje o1, Puntaje o2) {
			return o2.compareTo(o1);
		}
	});
	private String nivel;
	
    /**
	 * Carga los puntajes desde un archivo de texto
	 */
 	public Puntajes(String nivel) throws IOException{
		this.nivel=nivel;
 		File arch= new File(java.lang.System.getProperty("user.dir") + "/levels/" + this.nivel);
 		if(!arch.exists())
 			arch.createNewFile();
 		else {
			String nombre;
			int puntaje;
			Puntaje punt=null;
			BufferedReader inputPuntajes = new BufferedReader(new FileReader(arch));
			try{
				while ( (nombre=inputPuntajes.readLine() ) != null ) {
					puntaje = Integer.parseInt(inputPuntajes.readLine()); 
					punt = new Puntaje(nombre, puntaje);
					listadoPuntajes.add(punt);
				}
			}catch(NumberFormatException e){
				JOptionPane.showMessageDialog(null,
						"El archivo de puntajes es incorrecto.",
						"Error archivo de puntajes",
						JOptionPane.ERROR_MESSAGE);
			}
		}
	}

    /**
	 * Carga los puntajes desde un archivo de texto
     * @param level nivel a comparar
     * @return lista con puntajes del nivel mandado como paramentro
	 */
    public List<Puntaje> getLevelPunt(){
		List<Puntaje> puntLevel = new ArrayList<Puntaje>();
        for( Puntaje aux: this.listadoPuntajes )
        	puntLevel.add(aux);
        return puntLevel;
    }

	/**
	 * Imprime los puntajes
	 */
	public void imprimirPuntajes(){
		System.out.println("Nivel: " + this.nivel);
		System.out.println("size listadoPuntajes " + listadoPuntajes.size());
		for( Puntaje puntaje: listadoPuntajes )
			System.out.println(puntaje.toString());
	}

    /**
	 * Actualiza los puntajes en el listado
     * @param nombre Nombre del jugador
     * @param nivel Nivel que jugo
     * @param puntaje Puntaje que obtuvo
	 */
	public void updatePuntajes(String nombre, int puntaje){
		Puntaje nuevo = new Puntaje(nombre, puntaje);
		this.listadoPuntajes.add(nuevo);
		File arch= new File(java.lang.System.getProperty("user.dir") + "/levels/" + this.nivel);
		if (arch.exists())	{
			try{
				BufferedWriter outputPuntajes = new BufferedWriter(new FileWriter(arch));
				int i=0;
				for( Puntaje aux: listadoPuntajes )
					if( i<10 ){
						outputPuntajes.write(aux.toString());
						i++;
					}
				outputPuntajes.close();
			} catch(IOException e){
				System.err.println("Error:" + e.getMessage());
			}
		}	
	}
}